この章では、次の推奨事項について説明します。
TimesTenのダイレクトODBCおよびJDBCドライバを使用し、データ・ストアと同一のマシンでアプリケーションを実行すると、TimesTenのパフォーマンスを容易に最大限にできます。他のマシンのアプリケーションが、クライアント/サーバー機能を使用してTimesTenデータ・ストアにアクセスすることは可能ですが、ネットワーク通信量のオーバーヘッドによってパフォーマンスが大幅に低下します。
レプリケーションおよびCache Connect to Oracleを使用すると、クライアント/サーバー・アクセスのオーバーヘッドが発生することなく、データへのローカル・アクセスが可能になります。
次の状況では、アプリケーションは、クライアント/サーバー接続でTimesTenデータ・ストアに接続することを検討する必要があります。
TimesTen Client/Server接続が多数必要なシステムを設計した場合は、各データ・ストア接続でサーバー・ホスト上のオペレーティング・システムのリソースを消費していることに注意する必要があります。サーバー・ホストのサイジングおよびオペレーティング・システムのチューニングに、この要素を含める必要があります。
最高のパフォーマンスを得るには、複数回実行するSQL文をすべて事前に準備しておく必要があります。これはすべてのリレーショナル・データベースにあてはまります。ただし、TimesTenをきわめて高速なトランザクション率で使用する場合、文のコンパイルに必要な時間が、文の実行に必要な時間の数倍に達する可能性もあります。文の事前準備に加えて、それらの入力パラメータと出力列も事前にバインドしておく必要があります。
通常、TimesTen問合せオプティマイザには、効率的な問合せ計画を選択する大変優れた機能があります。ただし、効率的な計画を選択するには、複雑な問合せに含まれる表に関する追加情報が必要となります。
オプティマイザが効率的な計画を選択するには、データ・ストア統計を使用する必要があります。表について、行の数と列の値のデータ分布を把握することにより、オプティマイザはより高い確率で、その表にアクセスするための効率的な問合せ計画を選択できます。
通常、データ・ストアのすべての表の統計を更新してから、これらの表にアクセスする問合せを準備することをお薦めします。
行を挿入する前に表の統計を更新すると、表に行が含まれない(または数行のみが含まれる)ことを想定して、問合せが最適化されます。後で表に数百万行を移入して問合せを実行すると、表に含まれている行が数行だった場合には効果的に動作していた計画が、非常に低速になることもあります。
したがって、表の統計は、データとともにロードした後で、問合せを準備する前に更新する必要があります。
統計の更新の詳細は、『Oracle TimesTen In-Memory Database APIおよびSQLリファレンス・ガイド』のTimesTen組込みプロシージャに関する章にあるttOptUpdateStatsおよびttOptEstimateStatsの説明を参照してください。同じ章のその他のttOpt*組込みプロシージャの説明も非常に有用です。
通常のアプリケーションでは、データ・ストアにある程度の永続性が必要です。つまり、ハードウェアまたはソフトウェアの障害が原因でシステムがクラッシュした場合に、データ・ストアへの最新の更新が失われないことが要求されます。DurableCommits接続属性を使用してTimesTenを構成する方法がいくつかあります。
DurableCommits=0を使用したアプリケーションの場合、ttDurableCommit組込みプロシージャを使用すると、アプリケーション開発者は、TimesTenのインメモリー・ログ・バッファがディスクにフラッシュされるタイミングを正確に設定できるため、適切なレベルの永続性およびパフォーマンスを明示的に管理できます。アプリケーションは、ディスクへの同時書込みを発生させる(または発生させない)トランザクションを選択できます。これにより、アプリケーションで慎重にパフォーマンスとデータ永続性のバランスを取ることができます。アプリケーションによっては、特定の時間隔でttDurableCommitをコールする必要があります。そのため、1回に失われる可能性があるフラッシュされていないログ・バッファの保証は、100ミリ秒間のみです。2つの口座間の振替など、その他のアプリケーションでは、データ・ストアを永続状態にする必要があります。
TimesTenのレプリケーションまたはTimesTenからOracleへの更新の伝播(あるいはその両方)を使用すると、DurableCommit設定の選択に関係なく、トランザクションの永続性のレベルを追加できます。
データ・ストアのパフォーマンスを向上させるために、索引をどれくらい作成すればよいのかを判断するのは、少し困難なことです。作成した索引が少なすぎると、頻繁に行うデータ・ストア操作の一部が通常よりも遅くなります。作成した索引が多すぎると、索引の更新に余分な時間が必要になるために、挿入/更新/削除の操作に通常よりも時間がかかります。
TimesTenの表と索引のスキーマを設計する際に、考慮すべき問題がいくつかあります。
例:
T1に次の2つの索引が存在します。
T1に次の2つの索引が存在します。
T1に次の2つの索引が存在します。
T1に次の2つの索引が存在します。
ハッシュ索引: (COL1、COL2、COL3)
Tツリー索引: (COL3、COL1、COL2)
この場合、いずれの索引もこの問合せへの応答に効率的には使用できません。ただし、Tツリー索引は全表スキャンに使用できます。
前述の状況2と同じ理由で、ハッシュ索引は使用できません。問合せの行(COL1、COL2)は索引の先行接頭辞ではないため、Tツリー索引は使用できません。
いずれの索引も使用できないため、データ・ストアは表スキャンを実施して問合せに応答する必要があります(一時索引を作成する場合もあります)。その結果、問合せのパフォーマンスは低下します。
これらの例からわかるように、最も頻繁に行われるデータ・ストアへの問合せに基づいて、どの索引を作成するかを慎重に選択する必要があります。
適切な索引の作成の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の、文のチューニングと索引の使用の項、およびハッシュ索引またはTツリー索引の適切な選択の項を参照してください。
特定の問合せの実行が予想よりも低速である場合、TimesTenのオプティマイザが、問合せの応答に最適な問合せ計画を選択していない可能性があります。問合せによって生成される計画を確認する方法については、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の計画の表示の項を参照してください。
ODBCおよびJDBCのデフォルトでは、データ・ストアへのすべての接続は自動コミットが有効になっています。つまり、各SQL文がそれぞれのトランザクションでコミットされます。自動コミットを無効にして、単一のトランザクションで複数のSQL文を明示的にコミットすると、アプリケーションのパフォーマンスを大幅に改善できます。これは、バルク挿入またはバルク削除などの大規模な処理で特に有効です。(TTClassesの場合、自動コミットはデフォルトで無効になっています。)
ただし、単一のトランザクションにあまりにも多くの操作を含めると、ロックが長時間保持されるため、システム全体の同時実行性が低下するおそれがあります。通常、バルク挿入/更新/削除の操作は、数千行ごとにコミットすると、最も効率良く処理できる傾向があります。
TimesTen固有のAPIはODBCです。TimesTenのJava JDBCドライバは、TimesTenのODBCドライバの最上部に構成されたタイプ2ドライバです。このため、TimesTenのODBCドライバを使用したC/C++アプリケーションは、TimesTenのJDBCドライバを使用したJavaアプリケーションよりも少し高いパフォーマンスを実現できます。最高レベルのパフォーマンスが必要なアプリケーションは、TimesTenのODBCドライバを使用して開発する必要があります。
ODBCとJDBCとの予想されるパフォーマンス結果の差は、実行した問合せの種類(SELECTまたはUPDATE/INSERT/DELETE)およびトランザクションの構成(読込みから書込みまで)によって異なります。パフォーマンスに影響を与える要素は、次のとおりです。
基本的に、Javaアプリケーションは、アプリケーションとデータ・ストア間で転送されるデータ量が増加すると、パフォーマンスが低下します。ODBCとJDBCとの予想されるパフォーマンスの差異の詳細は、オラクル社カスタマ・サポート・センターにお問い合せください。
次に、Javaアプリケーションのパフォーマンスに影響を与える、Javaで継承されるその他の問題を示します。
特定のJVMは他のJVMよりも高速です。慎重に選択肢を判断してください。
大量の結果セットを返す場合は、SELECT文でMAXROWSオプションを使用してください。
アプリケーション設計によっては、データをロードした後にTツリー索引を作成すると、データのロードに要する時間を最小化できます。この場合、次の順序で操作を実行する必要があります。
多くのサード・パーティのデータベース・インタフェース・パッケージでは、データ・ストアのパフォーマンスにペナルティが課せられます。これらのインタフェースは、特定のアプリケーションでパフォーマンスが重要でない場合には使用できますが、ユーザーはパフォーマンスのトレードオフが発生することを認識している必要があります。
これらのサード・パーティのパッケージは低速なことがあるため、TimesTenではTTClassesという独自のC++ ODBCラッパー・クラスを開発しました。これはTimesTenに含まれています。TTClassesの詳細は、『Oracle TimesTen In-Memory Database TTClasses ガイド』を参照してください。